//+------------------------------------------------------------------+
//|                                                      Volumes.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.h"

//+------------------------------------------------------------------+
//| 累积/派发指标类 (Accumulation/Distribution)                      |
//| 用途：实现"累积/派发线"指标                                      |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiAD : public CIndicator
{
protected:
   ENUM_APPLIED_VOLUME m_applied;        // 应用成交量类型

public:
   /** 构造函数 */
   CiAD(void);
   
   /** 析构函数 */
   ~CiAD(void);
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @极 num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const ENUM极_APPLIED_VOLUME applied);
};

//+------------------------------------------------------------------+
//| 资金流量指标类 (Money Flow Index)                               |
//| 用途：实现"资金流量指数"指标                                    |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiMFI : public CIndicator
{
protected:
   int               m_ma_period;        // 移动平均周期
   ENUM_APPLIED_VOLUME m_applied;        // 应用成交量类型

public:
   /** 构造函数 */
   CiMFI(void);
   
   /** 析构函数 */
   ~CiMFI(void);
   
   /** 获取移动平均周期 */
   int               MaPeriod(void) const;
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period,
                            const int ma_period, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param ma_period 移动平均周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                                const int ma_period, const ENUM_APPLIED_VOLUME applied);
};

//+------------------------------------------------------------------+
//| 能量潮指标类 (On Balance Volume)                                |
//| 用途：实现"能量潮"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiOBV : public CIndicator
{
protected:
   ENUM_APPLIED_VOLUME m_applied;        // 应用成交量类型

public:
   /** 构造函数 */
   CiOBV(void);
   
   /** 析构函数 */
   ~CiOBV(void);
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间极期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
};

//+------------------------------------------------------------------+
//| 成交量指标类 (Volumes)                                          |
//| 用途：实现"成交量"指标                                           |
//|         继承自 CIndicator 类                                    |
//+------------------------------------------------------------------+
class CiVolumes : public CIndicator
{
protected:
   ENUM_APPLIED_VOLUME m_applied;        // 应用成交量类型

public:
   /** 构造函数 */
   CiVolumes(void);
   
   /** 析构函数 */
   ~CiVolumes(void);
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const;
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double            Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int       Type(void) const;

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      Initialize(const string symbol, const ENUM_TIMEFRAMES period, 
                                const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool              Initialize(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
};
//+------------------------------------------------------------------+